package com.crm.api.mapper;

import com.crm.api.entity.WorkOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 工单数据访问接口
 */
@Mapper
public interface WorkOrderMapper {

    /**
     * 查询工单列表（包含客户、业务、员工等详细信息）
     */
    List<Map<String, Object>> findWorkOrdersWithDetails(Map<String, Object> params);

    /**
     * 统计工单数量
     */
    Integer countWorkOrders(Map<String, Object> params);

    /**
     * 根据ID查询工单
     */
    WorkOrder findById(Integer id);

    /**
     * 根据ID查询工单详情（包含关联信息）
     */
    Map<String, Object> findByIdWithDetails(Integer id);

    /**
     * 插入工单
     */
    void insert(WorkOrder workOrder);

    /**
     * 更新工单
     */
    void update(WorkOrder workOrder);

    /**
     * 根据ID删除工单
     */
    void deleteById(Integer id);

    /**
     * 分配工单
     */
    void assignWorkOrder(@Param("id") Integer id, 
                        @Param("assignedTo") Integer assignedTo, 
                        @Param("assignedAt") Date assignedAt,
                        @Param("updatedAt") Date updatedAt);

    /**
     * 更新工单状态
     */
    void updateStatus(@Param("id") Integer id, 
                     @Param("status") String status, 
                     @Param("updatedAt") Date updatedAt);

    /**
     * 更新工单解决方案
     */
    void updateSolution(@Param("id") Integer id, 
                       @Param("solution") String solution, 
                       @Param("updatedAt") Date updatedAt);

    /**
     * 更新客户反馈
     */
    void updateCustomerFeedback(@Param("id") Integer id, 
                               @Param("customerFeedback") String customerFeedback, 
                               @Param("satisfactionRating") Integer satisfactionRating,
                               @Param("updatedAt") Date updatedAt);

    /**
     * 更新完成时间
     */
    void updateCompletedAt(@Param("id") Integer id, @Param("completedAt") Date completedAt);

    /**
     * 更新关闭时间
     */
    void updateClosedAt(@Param("id") Integer id, @Param("closedAt") Date closedAt);

    /**
     * 获取最大工单编号
     */
    String getMaxOrderCode();

    /**
     * 获取工单总数
     */
    Integer getTotalCount(Map<String, Object> params);

    /**
     * 获取状态统计
     */
    List<Map<String, Object>> getStatusStats(Map<String, Object> params);

    /**
     * 获取类型统计
     */
    List<Map<String, Object>> getTypeStats(Map<String, Object> params);

    /**
     * 获取优先级统计
     */
    List<Map<String, Object>> getPriorityStats(Map<String, Object> params);

    /**
     * 获取满意度统计
     */
    List<Map<String, Object>> getSatisfactionStats(Map<String, Object> params);

    /**
     * 获取员工处理统计
     */
    List<Map<String, Object>> getEmployeeStats(Map<String, Object> params);

    /**
     * 获取月度统计
     */
    List<Map<String, Object>> getMonthlyStats(Map<String, Object> params);

    /**
     * 获取平均处理时间
     */
    Double getAverageProcessingTime(Map<String, Object> params);
}